package com.iva.beam;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.ValueHolder;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.component.celleditor.CellEditor;
import org.primefaces.component.datatable.DataTable;
import org.primefaces.event.CellEditEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import com.iva.beam.profesor.LoginProfesoresBeam;
import com.iva.model.TbAlumno;
import com.iva.model.TbExpedienteAsistencias;
import com.iva.model.TbExpedienteMateriaHasRotacionesActividad;
import com.iva.model.TbRotacionesHasActividad;
import com.iva.model.VwAlumnosUsuario;
import com.iva.model.VwAsistencias;
import com.iva.model.VwNotas;
import com.iva.model.VwProfActividades;
import com.iva.service.asistenciasService;
import com.iva.service.findService;
import com.iva.service.tareasService;

@Component("tareaList")
public class TareasViewBeam implements Serializable{
	private String destination = "C:\\Apps\\"; 
	@Autowired
	private tareasService tareasService;
	
	
	@Autowired 
	private ApplicationContext context;
	
	@Autowired
	private findService find;
	
	@Autowired
	private asistenciasService asistenciasService;
	
	private List<VwProfActividades> vWProfActividades;
	private String notaActividad;
	public String getNotaActividad() {
		return notaActividad;
	}

	public void setNotaActividad(String notaActividad) {
		this.notaActividad = notaActividad;
	}
	private List<TbAlumno> listAlumno;
	
	private List<VwNotas> listNotas;
	private  String TEMPUSER = "FF001";
	private VwNotas selectVwNotas = new VwNotas();
	
	private StreamedContent file; 
	public StreamedContent getFile() {
		return file;
	}

	public void setFile(StreamedContent file) {
		this.file = file;
	}

	public VwNotas getSelectVwNotas() {
		return selectVwNotas;
	}
	private TbExpedienteMateriaHasRotacionesActividad actividad;
	
	public TbExpedienteMateriaHasRotacionesActividad getActividad() {
		return actividad;
	}

	public void setActividad(TbExpedienteMateriaHasRotacionesActividad actividad) {
		this.actividad = actividad;
	}
	private String asunto;

	public String getAsunto() {
		return asunto;
	}

	public void setAsunto(String asunto) {
		this.asunto = asunto;
	}

	public void setSelectVwNotas(VwNotas selectVwNotas) {
		this.selectVwNotas = selectVwNotas;
	}

	public List<VwNotas> getListNotas() {
		String sql = "where id.codigoAlumno='"+TEMPUSER+"'";
		return tareasService.listVwNotas(sql);
	}

	public void setListNotas(List<VwNotas> listNotas) {
		this.listNotas = listNotas;
	}

	public List<TbAlumno> getListAlumno() {
		return  tareasService.listTbAlumno();
	}

	public void setListAlumno(List<TbAlumno> listAlumno) {
		this.listAlumno = tareasService.listTbAlumno();
	}

	public List<VwProfActividades> getvWProfActividades() {
		System.out.println("entra al metodo");		
		String filter = "";
		return tareasService.listVwProfActividades(filter);
	}

	public void setvWProfActividades(List<VwProfActividades> vWProfActividades) {
		String filter = "";
		System.out.println("entra al metodo set"+tareasService.listVwProfActividades(filter).size());
		
		this.vWProfActividades = tareasService.listVwProfActividades(filter);
	}

	
	public void verTarea(VwNotas dto){
		this.selectVwNotas = dto;
		this.actividad = tareasService.findTbExpedienteMateriaHasRotacionesActividad(this.selectVwNotas.getId().getIdExpedienteMateriaHasRotacionesActividad());
		TbRotacionesHasActividad rot = find.findTbRotacionesHasActividad(dto.getId().getTbRotacionesHasActividadIdRotacionesHasActividad());
		
		try{
			InputStream stream = new ByteArrayInputStream(rot.getAttachement());
			 file = new DefaultStreamedContent(stream); 
		}catch(Exception ex){
			
		}
		
		
			
			
		if(this.actividad.getDescripcion() ==null || this.actividad.getDescripcion().equals("") || this.actividad.getDescripcion().equals(" ")){
			
			this.actividad.setDescripcion( "<br/><hr/>" + dto.getId().getDescripcion() );
		}else{
			this.actividad.setDescripcion("<br/><hr/>"+this.actividad.getDescripcion());
		}
		
//		return "dialog:enviarTarea";
	}
	
	public void calTarea(VwNotas dto){
		this.selectVwNotas =dto;
		this.actividad = tareasService.findTbExpedienteMateriaHasRotacionesActividad(this.selectVwNotas.getId().getIdExpedienteMateriaHasRotacionesActividad());
		this.selectVwNotas = dto;
		this.actividad = tareasService.findTbExpedienteMateriaHasRotacionesActividad(this.selectVwNotas.getId().getIdExpedienteMateriaHasRotacionesActividad());
		TbRotacionesHasActividad rot = find.findTbRotacionesHasActividad(dto.getId().getTbRotacionesHasActividadIdRotacionesHasActividad());
		
		try{
			InputStream stream = new ByteArrayInputStream(rot.getAttachement());
			 file = new DefaultStreamedContent(stream); 
		}catch(Exception ex){
			
		}
		
		if(this.actividad.getDescripcion() ==null || this.actividad.getDescripcion().equals("") || this.actividad.getDescripcion().equals(" ")){
			
			this.actividad.setDescripcion( "<br/><hr/>" + dto.getId().getDescripcion() );
		}else{
			this.actividad.setDescripcion("<br/><hr/>"+this.actividad.getDescripcion());
		}
		
	//	return "dialog:calificarTarea?dialog=true";
	}
	
	public void resPonderTarea(){
		setDefaultMensaje("O");		
		tareasService.upTarea(this.actividad);		
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Tarea Enviada con Exito",  null);  
        FacesContext.getCurrentInstance().addMessage(null, message);  		
	}
	
	public void observacionTarea(){
		setDefaultMensaje("E");
		tareasService.upTarea(this.actividad);		
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje Enviado Con Exito",  null);  
        FacesContext.getCurrentInstance().addMessage(null, message);
	}
	
	public void calificarTarea(){
		setDefaultMensaje("C");
		FacesMessage message = null;
		try{
			tareasService.upTarea(this.actividad);
			message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Tarea Calificada Con exito",  null);
		}catch(Exception ex){
			message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error al Calificar Tarea",  null);
		}
		finally{
			FacesContext.getCurrentInstance().addMessage(null, message);
		}
          
        
	}
	
	public void setDefaultMensaje(String status){
		Date date = new Date();
		String addtionalInformation = null;
		VwAlumnosUsuario dto = new VwAlumnosUsuario(); 
		HttpSession session = ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext().getSession( true );        
		dto = (VwAlumnosUsuario)session.getAttribute("dto");
		addtionalInformation = "Asunto:" + this.selectVwNotas.getId().getAsunto() + "<br/>" +
				"Enviado Por:" + dto.getId().getNombreCompleto() + "<br/>" +
				"Fecha de Envio :"+ date.toString() + "<br/><br/>";
		this.actividad.setDescripcion(addtionalInformation + this.getActividad().getDescripcion());
		this.actividad.setEstadoActividad(status);
	}
	
	
	public void verActividad(VwNotas dto){
		this.selectVwNotas = dto;		
		this.actividad = tareasService.findTbExpedienteMateriaHasRotacionesActividad(this.selectVwNotas.getId().getIdExpedienteMateriaHasRotacionesActividad());
		TbRotacionesHasActividad rot = find.findTbRotacionesHasActividad(dto.getId().getTbRotacionesHasActividadIdRotacionesHasActividad());		
		try{
			InputStream stream = new ByteArrayInputStream(rot.getAttachement());
			 file = new DefaultStreamedContent(stream); 
		}catch(Exception ex){
			
		}
		
		
			
			
		if(this.actividad.getDescripcion() ==null || this.actividad.getDescripcion().equals("") || this.actividad.getDescripcion().equals(" ")){
			
			this.actividad.setDescripcion( "<br/><hr/>" + dto.getId().getDescripcion() );
		}else{
			this.actividad.setDescripcion("<br/><hr/>"+this.actividad.getDescripcion());
		}
		
//		return "dialog:alumnoVerActividad";
	}
	
	public String autActividad(VwNotas dto){
		this.selectVwNotas = dto;
		this.actividad = tareasService.findTbExpedienteMateriaHasRotacionesActividad(this.selectVwNotas.getId().getIdExpedienteMateriaHasRotacionesActividad());
		TbRotacionesHasActividad rot = find.findTbRotacionesHasActividad(dto.getId().getTbRotacionesHasActividadIdRotacionesHasActividad());
		
		try{
			InputStream stream = new ByteArrayInputStream(rot.getAttachement());
			 file = new DefaultStreamedContent(stream); 
		}catch(Exception ex){
			
		}
		
		
			
			
		if(this.actividad.getDescripcion() ==null || this.actividad.getDescripcion().equals("") || this.actividad.getDescripcion().equals(" ")){
			
			this.actividad.setDescripcion( "<br/><hr/>" + dto.getId().getDescripcion() );
		}else{
			this.actividad.setDescripcion("<br/><hr/>"+this.actividad.getDescripcion());
		}
		
		return "dialog:parentVerActividad";
	}
	
	
	
	
	
	public void conCellEdit(CellEditEvent event){
		LoginProfesoresBeam tabMenuProfesores = (LoginProfesoresBeam)context.getBean("loginProfesoresBeam");
		
		try{
			DataTable o = (DataTable) event.getSource();
			VwNotas[] dinamicNotas = (VwNotas[])o.getRowData(); 
			for(VwNotas notas:dinamicNotas){
				this.selectVwNotas = notas;
				System.out.println("nueva nota " + this.selectVwNotas.getId().getNotaActividad());
				 TbExpedienteMateriaHasRotacionesActividad tareasActividad= tareasService.findTbExpedienteMateriaHasRotacionesActividad(selectVwNotas.getId().getIdExpedienteMateriaHasRotacionesActividad());
				 tareasActividad.setNotaActividad(this.selectVwNotas.getId().getNotaActividad());
				System.out.println("expediente id " + selectVwNotas.getId().getIdExpedienteMateriaHasRotacionesActividad());
				tareasService.upTarea(tareasActividad);
			}
			
			tabMenuProfesores.dirige(3);
			this.selectVwNotas = new VwNotas();
			this.notaActividad = "";
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
	}
	
	public void conCellEditAsistencias(CellEditEvent event){
		LoginProfesoresBeam tabMenuProfesores = (LoginProfesoresBeam)context.getBean("loginProfesoresBeam");
		try{
			DataTable o = (DataTable) event.getSource();
			VwAsistencias[] dinamicAsistencias = (VwAsistencias[]) o.getRowData();
			for(VwAsistencias asis:dinamicAsistencias){
				System.out.println("Asistencia Dia " + asis.getId().getFecha().toString());
				TbExpedienteAsistencias tbAsistencias = asistenciasService.findTbExpedienteAsistencias(asis.getId().getIdtbExpedienteAsistencias());
				tbAsistencias.setAsistenciaEstado(asis.getId().getAsistenciaEstado());
				asistenciasService.updateAsistencias(tbAsistencias);
				tabMenuProfesores.dirige(1);
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
	}

}
